home *** CD-ROM | disk | FTP | other *** search
/ Amiga Collections: Franz PD / Franz PD Disk #334 (1994-06)(Rhein-Sieg-Soft).zip / Franz PD Disk #334 (1994-06)(Rhein-Sieg-Soft).adf / ASo-Tools / Sources / AskFile.asm < prev    next >
Assembly Source File  |  1994-06-13  |  13KB  |  444 lines

  1. ;* $Revision Header built automatically *************** (do not edit) ************
  2. ;*
  3. ;* © Copyright by (none)
  4. ;*
  5. ;* File             : AskFile.asm
  6. ;* Created on       : Monday, 14.02.94 10:01:32
  7. ;* Created by       : Arnold Schommer
  8. ;* Current revision : V1.3
  9. ;*
  10. ;*
  11. ;* Purpose
  12. ;* -------
  13. ;*   - Opens an ASL-FileRequester and asks for a filename.
  14. ;*     The result is stored in a variable (local or ENV:).
  15. ;*
  16. ;* Revision V1.3
  17. ;* --------------
  18. ;* created on Sunday, 20.02.94 20:36:56  by  Arnold Schommer.   LogMessage :
  19. ;*   - returns quickly if started from WB (does not even open
  20. ;*     dos.library etc.)
  21. ;*
  22. ;* Revision V1.2
  23. ;* --------------
  24. ;* created on Tuesday, 15.02.94 10:30:46  by  Arnold Schommer.   LogMessage :
  25. ;*   - now fully resident (uses about 1K of vars on stack)
  26. ;*
  27. ;* Revision V1.1
  28. ;* --------------
  29. ;* created on Tuesday, 15.02.94 09:34:34  by  Arnold Schommer.   LogMessage :
  30. ;*   - now reentrant
  31. ;*
  32. ;* Revision V1.0
  33. ;* --------------
  34. ;* created on Monday, 14.02.94 10:01:32  by  Arnold Schommer.   LogMessage :
  35. ;*     --- Initial release ---
  36. ;*
  37. ;*********************************************************************************
  38. REVISION  MACRO
  39.           dc.b "1.3"
  40.           ENDM
  41. REVDATE   MACRO
  42.           dc.b "20.02.94"
  43.           ENDM
  44. REVTIME   MACRO
  45.           dc.b "20:36:56"
  46.           ENDM
  47. AUTHOR    MACRO
  48.           dc.b "Arnold Schommer"
  49.           ENDM
  50. VERNUM    EQU  1
  51. REVNUM    EQU  3
  52. NAME      MACRO
  53.           dc.b "AskFile"
  54.           ENDM
  55. ****************************************************************************
  56. TEMPLATE: macro
  57.         dc.b    "VAR=VARNAME/A,LOCAL/S,QUESTION=TITLE/A,CONFIRM/K,CANCEL/K,"
  58.         dc.b    "NO_OLD=BLANK/S,FILE/K,DIR/K,NOFILES/S,SAVE/S,PATTERN/K,"
  59.         dc.b    "PATTERN_GADGET=PATGG/S",0
  60.         endm
  61. ****************************************************************************
  62.         NOLIST
  63.         INCLUDE "exec/LVO.i"
  64.         INCLUDE "exec/libraries.i"
  65.         INCLUDE "dos/LVO.i"
  66.         INCLUDE "dos/dos.i"
  67.         INCLUDE "dos/dosextens.i"
  68.         INCLUDE "dos/rdargs.i"
  69.         INCLUDE "dos/var.i"
  70.         INCLUDE "libraries/asl.i"
  71.         INCLUDE "libraries/asl_LVO.i"
  72.         INCLUDE "utility/tagitem.i"
  73.  
  74. DOS:    MACRO
  75.         move.l  _DosBase(a4),a6
  76.         CALL    \1
  77.         ENDM
  78. XASL:   MACRO
  79.         move.l  _AslBase(a4),a6
  80.         CALL    \1
  81.         ENDM
  82.         LIST
  83. ****************************************************************************
  84. ;Rahmen-Programm, welches die Libraries öffnet und eine ordnungsgemäße
  85. ;Rückkehr gewährleistet:
  86.  
  87.         CODE
  88. ; eigene Variablen auf dem Stack anlegen
  89. ; (es sind nur etwa 1K, also durchaus akzeptabel)
  90.         lea     -SIZE_data(sp),sp
  91.         move.l  sp,a4
  92.         move.l  sp,FrameSP(a4)
  93.         moveq   #0,d0
  94.         move.l  d0,_DosBase(a4)
  95.         move.l  d0,_AslBase(a4)
  96.         move.l  d0,RetCode(a4)
  97.         move.l  d0,readargs(a4)
  98.         move.l  d0,FRQ(a4)
  99.         sub.l   a1,a1           ;a1=0->eigener Task
  100.         CALLEXEC FindTask       ;Wo darf man denn nachschauen ?
  101.         move.l  d0,a3
  102.         tst.l   pr_CLI(a3)      ;von CLI oder WB aus gestartet ?
  103.         bne     fromCLI
  104. ;von WB aus: ist nicht vorgesehen (keine Parameterübergabe), also Abbruch
  105.         lea     pr_MsgPort(a3),a0
  106.         CALL    WaitPort        ;auf Start-Message warten
  107.         lea     pr_MsgPort(a3),a0
  108.         CALL    GetMsg
  109.         move.l  d0,-(sp)        ;Startup-Message sichern
  110. ;Message zur WB zurück
  111.         CALLEXEC Forbid
  112.         move.l  (sp)+,a1
  113.         CALL    ReplyMsg
  114.         lea     SIZE_data(a4),sp
  115.         moveq   #RETURN_FAIL,d0
  116.         rts
  117. ;Libraries öffnen:
  118. fromCLI: OPENLIB DosName(pc)
  119.         move.l  d0,_DosBase(a4)
  120.         bne     1$
  121. ;Fehler: KEINE dos.library !?!
  122.         moveq   #RETURN_FAIL,d0
  123.         bra     _exit
  124. 1$:     move.l  d0,a0
  125.         cmp.w   #37,LIB_VERSION(a0)
  126.         bge     2$
  127. ;Fehler: alte Dos-Library
  128.         move.l  d0,a6
  129.         CALL    Output
  130.         move.l  d0,d1
  131.         lea     error_olddos(pc),a0
  132.         move.l  a0,d2
  133.         moveq   #SIZE_error_olddos,d3
  134.         CALL    Write
  135.         moveq   #RETURN_ERROR,d0
  136.         bra     _exit
  137. 2$:     OPENLIB AslName(pc),36
  138.         move.l  d0,_AslBase(a4)
  139.         bne     4$
  140. ;Fehler: keine Asl-Library
  141.         lea     error_noasl(pc),a0
  142.         bra     _error
  143. ;Das Hauptprogramm aufrufen:
  144. 4$:     bsr     main
  145.         moveq   #RETURN_OK,d0
  146. _exit:  move.l  d0,RetCode(a4)
  147.         move.l  FrameSP(a4),sp
  148. ;Freigabe der RDArgs-Struktur
  149.         move.l  readargs(a4),d1
  150.         beq     1$
  151.         DOS     FreeArgs
  152. ;Freigabe des FileRequesters
  153. 1$:     move.l  FRQ(a4),d0
  154.         beq     2$
  155.         move.l  d0,a0
  156.         XASL    FreeAslRequest
  157. ;die Libraries schließen
  158. 2$:     move.l  _AslBase(a4),d0
  159.         beq     CloseDos
  160.         CLOSELIB d0
  161. CloseDos: move.l _DosBase(a4),d0
  162.         beq     ende
  163.         CLOSELIB d0
  164. ;und wieder zurück
  165. ende:   move.l  RetCode(a4),d0
  166.         lea     SIZE_data(a4),sp
  167.         rts
  168. ****************************************************************************
  169. ;Versions-String
  170.         dc.b    "$VER: "
  171.         NAME
  172.         dc.b    " "
  173.         REVISION
  174.         dc.b    " ("
  175.         REVDATE
  176.         dc.b    ")",0
  177.         even
  178. ****************************************************************************
  179. ;Fehler-Ausstieg speziell für Dos-Fehler, die über IoErr() identifiziert
  180. ;werden.
  181. _io_error:
  182.         DOS     IoErr
  183.         move.l  d0,d1
  184.         moveq   #0,d2
  185.         move.l  #Var,d3
  186.         add.l   a4,d3
  187.         move.l  #514,d4
  188.         CALL    Fault
  189.         lea     Var(a4),a0
  190. ;        bra     _error
  191. ****************************************************************************
  192. ;Fehler-Ausstieg:
  193. _error: move.l  a0,-(sp)
  194.         move.l  sp,d2
  195.         lea     error_any(pc),a0
  196.         move.l  a0,d1
  197.         DOS     VPrintf
  198.         moveq   #RETURN_ERROR,d0
  199.         bra     _exit
  200. ****************************************************************************
  201. main:
  202. ;Argumenten-Array löschen
  203.         moveq   #0,d0
  204.         moveq   #NARGS-1,d1
  205.         lea     rargs(a4),a0
  206. 1$:     move.l  d0,(a0)+
  207.         dbra    d1,1$
  208. ;Parsen lassen
  209.         lea     Template(pc),a0
  210.         move.l  a0,d1
  211.         move.l  #rargs,d2
  212.         add.l   a4,d2
  213.         moveq   #0,d3
  214.         DOS     ReadArgs
  215.         move.l  d0,readargs(a4)
  216.         beq     _io_error
  217.         moveq   #0,d0
  218.         move.b  d0,FileName(a4)
  219.         move.b  d0,DirName(a4)
  220.         tst.l   ARG_DONT_READ(a4)
  221.         bne     dont_read
  222. ;genannte Variable auslesen
  223.         move.l  ARG_VARNAME(a4),d1
  224.         move.l  #Var,d2
  225.         add.l   a4,d2
  226.         move.l  #514,d3
  227.         moveq   #LV_VAR,d4
  228.         tst.l   ARG_VARTYPE(a4)
  229.         bne     2$
  230.         move.l  #GVF_GLOBAL_ONLY|LV_VAR,d4
  231. 2$:     DOS     GetVar
  232.         cmp.l   #513,d0
  233.         ble     3$
  234.         lea     error_big_var(pc),a0
  235.         bra     _error
  236. 3$:     move.l  #Var,d1
  237.         add.l   a4,d1
  238.         CALL    FilePart
  239.         move.l  d0,a0
  240.         bsr     SetFilePreset
  241.         move.l  #Var,d1
  242.         add.l   a4,d1
  243.         CALL    PathPart
  244.         move.l  d0,a0
  245.         move.b  #0,(a0)
  246.         lea     Var(a4),a0
  247.         bsr     SetDirPreset
  248. dont_read:
  249.         lea     ARG_FILE_PRESET(a4),a0
  250.         bsr     SetFilePreset
  251.         lea     ARG_DIR_PRESET(a4),a0
  252.         bsr     SetDirPreset
  253. ;Tag-Liste für FRQ aufbauen:
  254.         lea     FRQ_Tags(a4),a2
  255.         move.l  #ASL_Hail,(a2)+
  256.         move.l  ARG_QUESTION(a4),(a2)+
  257.         lea     FileName(a4),a0
  258.         tst.b   (a0)
  259.         beq     4$
  260.         move.l  #ASL_File,(a2)+
  261.         move.l  a0,(a2)+
  262. 4$:     lea     DirName(a4),a0
  263.         tst.b   (a0)
  264.         beq     5$
  265.         move.l  #ASL_Dir,(a2)+
  266.         move.l  a0,(a2)+
  267. 5$:     move.l  ARG_OK_TEXT(a4),d0
  268.         beq     6$
  269.         move.l  #ASL_OKText,(a2)+
  270.         move.l  d0,(a2)+
  271. 6$:     move.l  ARG_CANCEL_TEXT(a4),d0
  272.         beq     7$
  273.         move.l  #ASL_CancelText,(a2)+
  274.         move.l  d0,(a2)+
  275. 7$:     tst.l   ARG_SELECT_DIR(a4)
  276.         beq     8$
  277.         move.l  #ASL_ExtFlags1,(a2)+
  278.         move.l  #FIL1F_NOFILES,(a2)+
  279. 8$:     tst.l   ARG_SAVEFLAG(a4)
  280.         beq     9$
  281.         move.l  #ASL_FuncFlags,(a2)+
  282.         move.l  #FILF_SAVE,(a2)+
  283. 9$:     tst.l   ARG_PATGAD(a4)
  284.         beq     10$
  285. ;das neue Flag ggf. über das gerade geschriebene hinüber-odern:
  286.         move.l  #ASL_FuncFlags,d0
  287.         move.l  #FILF_PATGAD,d1
  288.         cmp.l   -8(a2),d0
  289.         beq     12$
  290.         move.l  d0,(a2)+        ;neu schreiben
  291.         move.l  d1,(a2)+
  292.         bra     10$
  293. 12$:    or.l    d1,-4(a2)       ;odern
  294. 10$:    move.l  ARG_PATTERN(a4),d0
  295.         beq     11$
  296.         move.l  #ASL_Pattern,(a2)+
  297.         move.l  d0,(a2)+
  298. 11$:    move.l  #TAG_END,(a2)
  299.  
  300. ;FileRequester allozieren
  301.         move.l  #ASL_FileRequest,d0
  302.         lea     FRQ_Tags(a4),a0
  303.         XASL    AllocAslRequest
  304.         move.l  d0,FRQ(a4)
  305.         bne     do_frq
  306. ;Fehler: kein Filerequester
  307.         lea     error_nofrq(pc),a0
  308.         bra     _error
  309.  
  310. ;FileRequester aufrufen:
  311. do_frq: move.l  d0,a0
  312.         CALL    RequestFile
  313.         tst.l   d0
  314.         beq     ret_warn
  315. ;File/Pfad ausgewählt: zusammensetzen
  316.         lea     Var(a4),a1
  317.         move.b  #0,(a1)
  318.         move.l  FRQ(a4),a0
  319.         move.l  rf_Dir(a0),d0
  320.         beq     nodir
  321. ;Pfadnamen kopieren
  322.         move.l  d0,a0
  323. 1$:     move.b  (a0)+,(a1)+
  324.         bne     1$
  325. ;Dateinamen anhängen ?
  326. nodir:  tst.l   ARG_SELECT_DIR(a4)
  327.         bne     setvar                  ;es sollte keine Datei gewählt werden
  328.         move.l  FRQ(a4),a0
  329.         move.l  rf_File(a0),d2
  330.         beq     setvar
  331.         move.l  d2,a0
  332.         tst.b   (a0)
  333.         beq     setvar
  334.         move.l  #Var,d1
  335.         add.l   a4,d1
  336.         move.l  #513,d3
  337.         DOS     AddPart
  338.         tst.l   d0
  339.         beq     longfname
  340. ;Dateinamen in Variable schreiben
  341. setvar: move.l  ARG_VARNAME(a4),d1
  342.         move.l  #Var,d2
  343.         add.l   a4,d2
  344.         moveq   #-1,d3
  345.         moveq   #LV_VAR,d4
  346.         tst.l   ARG_VARTYPE(a4)
  347.         bne     1$
  348.         move.l  #GVF_GLOBAL_ONLY|LV_VAR,d4
  349. 1$:     CALL    SetVar
  350.         tst.l   d0
  351.         beq     _io_error
  352.         rts
  353. ;Dateiname war zu lang -> Text & exit(RETURN_WARN);
  354. longfname:
  355.         lea     warning_longfname(pc),a0
  356.         move.l  a0,d1
  357.         DOS     PutStr
  358. ret_warn:
  359.         moveq   #RETURN_WARN,d0
  360.         bra     _exit
  361. ****************************************************************************
  362. SetFilePreset:
  363.         lea     WarningFNPreset(pc),a1
  364.         move.l  a1,d1
  365.         lea     FileName(a4),a1
  366.         bra     SetAnyPreset
  367. ****************************************************************************
  368. SetDirPreset:
  369.         lea     WarningDNPreset(pc),a1
  370.         move.l  a1,d1
  371.         lea     DirName(a4),a1
  372. SetAnyPreset:
  373.         move.l  a0,d0
  374.         beq     1$
  375.         tst.b   (a0)
  376.         beq     1$              ;leer-Strings werden NICHT kopiert !
  377.         moveq   #0,d0
  378. 2$:     tst.b   0(a0,d0.l)
  379.         beq     strcpy          ;String-Ende ?
  380.         addq.b  #1,d0
  381.         bvc     2$              ;Länge >255 -> Überlauf ?
  382.         DOS     PutStr
  383. 1$:     rts
  384. strcpy: move.b  (a0)+,(a1)+
  385.         bne     strcpy
  386.         rts
  387. ****************************************************************************
  388. AslName: ASLNAME
  389. DosName: DOSNAME
  390.  
  391. ;verschiedene Fehler-Texte:
  392. error_olddos:
  393.         NAME
  394.         dc.b ": dos.library v37+ required",10
  395. SIZE_error_olddos: equ *-error_olddos
  396. error_any:
  397.         NAME
  398.         dc.b ": %s",10,0
  399. error_noasl:    dc.b "asl.library v36+ required",0
  400. error_big_var:  dc.b "variable too big",0
  401. error_nofrq:    dc.b "Filerequester not available !",0
  402.  
  403. WarningDNPreset:
  404.         NAME
  405.         dc.b ": preset for filename too long",10,0
  406. WarningFNPreset:
  407.         NAME
  408.         dc.b ": preset for dirname too long",10,0
  409. warning_longfname:
  410.         NAME
  411.         dc.b ": new filename too long",10,0
  412.  
  413. Template:       TEMPLATE
  414. ****************************************************************************
  415. ;Definition der eigenen Variablen:
  416.  
  417. FrameSP:        equ 0
  418. RetCode:        equ FrameSP+4
  419. _AslBase:       equ RetCode+4
  420. _DosBase:       equ _AslBase+4
  421. readargs:       equ _DosBase+4
  422. FRQ:            equ readargs+4
  423. rargs:          equ FRQ+4
  424. ARG_VARNAME:    equ rargs
  425. ARG_VARTYPE:    equ ARG_VARNAME+4
  426. ARG_QUESTION:   equ ARG_VARTYPE+4
  427. ARG_OK_TEXT:    equ ARG_QUESTION+4
  428. ARG_CANCEL_TEXT: equ ARG_OK_TEXT+4
  429. ARG_DONT_READ:  equ ARG_CANCEL_TEXT+4
  430. ARG_FILE_PRESET: equ ARG_DONT_READ+4
  431. ARG_DIR_PRESET: equ ARG_FILE_PRESET+4
  432. ARG_SELECT_DIR: equ ARG_DIR_PRESET+4
  433. ARG_SAVEFLAG:   equ ARG_SELECT_DIR+4
  434. ARG_PATTERN:    equ ARG_SAVEFLAG+4
  435. ARG_PATGAD:     equ ARG_PATTERN+4
  436. FRQ_Tags:       equ ARG_PATGAD+4
  437. NARGS:          equ (FRQ_Tags-rargs)/4
  438. Var:            equ FRQ_Tags+(NARGS*8)
  439. FileName:       equ Var+514
  440. DirName:        equ FileName+256
  441. SIZE_data:      equ DirName+256
  442.  
  443.         END
  444.